﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using System.Reflection;
using System.Text.RegularExpressions;

namespace JESAI.DynamicWebApi.Extensions
{
    public static class Common
    {
        /// <summary>
        /// 从给定字符串的结尾移除给定后缀的第一个匹配项。排序很重要。如果其中一个后缀匹配，则不会测试其他后缀。
        /// </summary>
        /// <param name="str">字符串</param>
        /// <param name="postFixes">一个或者多个后缀</param>
        /// <returns>修改过的字符串或相同的字符串（如果它没有任何给定的后缀）</returns>
        public static string RemovePostFix(this string str, params string[] postFixes)
        {
            if (str == null)
            {
                return null;
            }

            if (str == string.Empty)
            {
                return string.Empty;
            }

            if (postFixes.IsNullOrEmpty())
            {
                return str;
            }

            foreach (var postFix in postFixes)
            {
                if (str.EndsWith(postFix))
                {
                    return str.Left(str.Length - postFix.Length);
                }
            }

            return str;
        }

        /// <summary>
        /// 检查给定的集合对象是否为空或没有项。
        /// </summary>
        public static bool IsNullOrEmpty<T>(this ICollection<T> source)
        {
            return source == null || source.Count <= 0;
        }

        /// <summary>
        /// 从字符串的开头获取字符串的子字符串。
        /// </summary>
        /// <exception cref="ArgumentNullException">如果目标字符串<paramref name="str"/>为空则抛异常</exception>
        /// <exception cref="ArgumentException">如果长度<paramref name="len"/>超过字符串的长度</exception>
        public static string Left(this string str, int len)
        {
            if (str == null)
            {
                throw new ArgumentNullException("str");
            }

            if (str.Length < len)
            {
                throw new ArgumentException("要截取的长度超过字符串的长度!");
            }

            return str.Substring(0, len);
        }

        /// <summary>
        ///检查项是否在指定集合里面
        /// </summary>
        /// <param name="item">待检查的项</param>
        /// <param name="list">目标集合</param>
        /// <typeparam name="T">泛型对像</typeparam>
        public static bool IsIn<T>(this T item, params T[] list)
        {
            return list.Contains(item);
        }

        /// <summary>
        /// 指示此字符串是空字符串还是System.string.Empty字符串。
        /// </summary>
        public static bool IsNullOrEmpty(this string str)
        {
            return string.IsNullOrEmpty(str);
        }

        /// <summary>
        /// 获取Type所在的程序集
        /// </summary>
        /// <param name="type">对象实例的Type类型</param>
        /// <returns>程序集(Assembly)</returns>
        public static Assembly GetAssembly(this Type type)
        {
            return type.GetTypeInfo().Assembly;
        }
        /// <summary>
        /// 获取驼峰法首单词，比如addName 得到add
        /// </summary>
        /// <param name="str">字符串</param>
        /// <returns></returns>
        public static string GetCamelCaseFirstWord(this string str)
        {
            if (str == null)
            {
                throw new ArgumentNullException(nameof(str));
            }

            if (str.Length == 1)
            {
                return str;
            }

            var res = Regex.Split(str, @"(?=\p{Lu}\p{Ll})|(?<=\p{Ll})(?=\p{Lu})");

            if (res.Length < 1)
            {
                return str;
            }
            else
            {
                return res[0];
            }
        }

        /// <summary>
        /// 帕斯卡拼法，首字母大写，获取第一个单词，比如AddName。获取Add
        /// </summary>
        /// <param name="str">字符串</param>
        /// <returns></returns>
        public static string GetPascalCaseFirstWord(this string str)
        {
            if (str == null)
            {
                throw new ArgumentNullException(nameof(str));
            }

            if (str.Length == 1)
            {
                return str;
            }

            var res = Regex.Split(str, @"(?=\p{Lu}\p{Ll})|(?<=\p{Ll})(?=\p{Lu})");

            if (res.Length < 2)
            {
                return str;
            }
            else
            {
                return res[1];
            }
        }
        /// <summary>
        /// 获取帕斯卡或者驼峰法第一个单词，比如addName、AddName。则返回add、Add
        /// </summary>
        /// <param name="str">字符串</param>
        /// <returns></returns>
        public static string GetPascalOrCamelCaseFirstWord(this string str)
        {
            if (str == null)
            {
                throw new ArgumentNullException(nameof(str));
            }

            if (str.Length == 1)
            {
                return str;
            }

            //如果首字母是大写，则返回帕斯卡，否则驼峰
            if (str[0] >= 65 && str[0] <= 90)
            {
                return GetPascalCaseFirstWord(str);
            }
            else
            {
                return GetCamelCaseFirstWord(str);
            }
        }
    }
}
